
//头文件:#include<sys/eventfd.h>

//和socket,管道一样，eventfd也是fd，可加入epoll，如果要通知事件循环，往socket，管道，eventfd中写入数据即可



int main(int argc, char *argv[])
{
    int efd = eventfd(0, 0);    //第二个参数可以是:EFD_CLOEXEC|EFD_NONBLOCK|EFD_SEMAPHORE 三个中的0~3个都可以


    uint64_t buf = 3;   //uint64_t定义出来就是8字节
    ssize_t ret;

    //写入eventfd，buf必须是8字节
    ret = write(efd, &buf, sizeof(uint64_t));

    //读出eventfd
    ret = read(efd, &buf, sizeof(uint64_t));
    printf("ret = %d, buf = %d\n", ret, buf);   //读取成功，ret=8(也就是返回buf的大小)，buf=3
                    //buf=3怎么来的，首先，创建eventfd时，第一个参数为初始值，是0，后面又write写入了一个3，
                    //所以读的时候就是0+3=3，如果初始值是2，读出来就是5.
                    //并且，read()过后，eventfd会清零，(即read会将eventfd的全部数据读出来)
                    //如果eventfd为0，再运行read去读取，会阻塞，例如定义efd初始值为0，直接read去读就会阻塞

    close(efd); //关闭eventfd



    return 0;
}
